package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序自定义类型元素的集合
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1,2));
        list.add(new Point(3,4));
        list.add(new Point(5,5));
        list.add(new Point(6,7));
        list.add(new Point(9,1));
        list.add(new Point(8,3));
        System.out.println(list);
        /*
            Collection.sort(List list)
            该方法要求集合元素必须实现可比较的接口Collection,否则编译不通过.
            这样做对我们的程序具有侵入性。因此当不能使用该方法时就不建议使用。

            侵入性:当我们调用某个API的方法时，该方法要求我们为其修改其他地方的代码后才能工作时.
            这样的行为就是侵入性，它不利于代码的后期维护.
         */
//        Collections.sort(list);//没实现接口Comparable:定义元素之间比较大小.

        /** 解决侵入性 */
        /*
            重载的sort方法要求我们在传入一个比较器(自定义的一个比较规则).然后利用该比较器的
            比较规则排序集合.
            比较器的定义需要实现接口:Comparator并重写方法compare来定义比较规则。
            compare方法用来定义参数o1和o2的大小关系，返回值为谁大谁小，具体返回规则为:
            当返回值>0时，表示o1>o2
            当返回值<0时，表示o1<o2
            当返回值=0时，表示o1=o2
         */
        /** Comparator:比较器 */
//        Comparator<Point> c = new Comparator<Point>() {
//            @Override
//            public int compare(Point o1, Point o2) {
//                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//                return len1-len2;
//            }
//        };
//        Collections.sort(list,c);

//        Collections.sort(list, new Comparator<Point>() {
//            @Override
//            public int compare(Point o1, Point o2) {
//                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//                return len1-len2;
//            }
//        });//则解决侵入性,";"为一句话.而不是,该方法要求我们为其修改其他地方的代码后才能工作时.
//        System.out.println(list);
        /** lambda:表达式 */
        Collections.sort(list,
                (o1,o2)->o1.getX()*o1.getX()+o1.getY()*o1.getY()-
                        o2.getX()*o2.getX()+o2.getY()*o2.getY());

        System.out.println(list);




    }
}
